package com.fefa.coins.db;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class MonedaColeccionExtended extends MonedaColeccion {
	private String nombreSocio = null;
	private String descrPedido = null;
	private Date fechaApunte = null;
	private String descrApunte = null;
	private MonedaExtended monedaExtended = null;

	private final static String GET_MONEDA_SQL = "SELECT " +
	"  `colecciones`.`id`, `colecciones`.`propietario`, `colecciones`.`moneda`," +
	"  `colecciones`.`estado`, `colecciones`.`pedido`, `colecciones`.`apunte`," +
	"  `colecciones`.`fecha`, `colecciones`.`unid_pedidas`, `colecciones`.`unidades`," +
	"  `colecciones`.`unid_repetidas`, `colecciones`.`precio_prev`, `colecciones`.`precio_real`," +
	"  `colecciones`.`observaciones`, `socios`.`nombre`, `pedidos`.`descripcion`," +
	"  `apuntes`.`fecha`, `apuntes`.`descripcion`," +
	"  `monedas`.`id`, `monedas`.`pais`, `monedas`.`ceca`, `monedas`.`year`," +
	"  `monedas`.`estrella`, `monedas`.`divisa`, `monedas`.`facial`, `monedas`.`orden_aux`," +
	"  `monedas`.`modelo`, `monedas`.`km`, `monedas`.`observaciones`," +
	"  `paises`.`pais` as nPais, `divisas`.`divisa` as nDivisa," +
	"  `divisas`.`fraccion`, `divisas`.`multiplo` " +
	"FROM `colecciones` LEFT JOIN `pedidos` ON `colecciones`.`pedido`= `pedidos`.`id` LEFT JOIN `apuntes` ON `colecciones`.`apunte`=`apuntes`.`id`," +
	" `monedas`, `paises`, `divisas`, `socios` " +
	"WHERE (`colecciones`.`moneda` = `monedas`.`id`)" +
	"  AND (`colecciones`.`propietario` = `socios`.`id`)" +
	"  AND (`monedas`.`pais` = `paises`.`id`)" +
	"  AND (`monedas`.`divisa` = `divisas`.`id`) ";

	public static MonedaColeccionExtended readMonedaColeccionExt(Connection conn, Long _id) throws SQLException {
		MonedaColeccionExtended _moneda = new MonedaColeccionExtended(); 
		PreparedStatement stmt=null;
		ResultSet rs = null;

		stmt=conn.prepareStatement(GET_MONEDA_SQL + " WHERE `colecciones`.`id`=?");
		stmt.setLong(1, _id.longValue());
		rs = stmt.executeQuery();
		if (rs.next()) 
			_moneda.loadMonedaColExtFromResultSet(rs);
		else 
			_moneda = null;

		if (rs != null) rs.close();
		if (stmt != null) stmt.close(); 

		return _moneda;
	}

	public static ArrayList<MonedaColeccionExtended> searchMonedasColeccionExt(Connection conn, String where, String sort) throws SQLException {
		String query = GET_MONEDA_SQL;
		if ((where != null) && (where.trim().length()>0)) {
			query +="AND " + where + " ";
		}
		if ((sort != null) && (sort.trim().length()>0)) {
			query +="ORDER BY " + sort + " ";
		}
		// Creamos el Statement y el ResultSet.
		Statement stm = conn.createStatement();
		ResultSet rs = stm.executeQuery(query);

		// Procesamos el ResultSet.
		ArrayList<MonedaColeccionExtended> lMonedas = null;
		while (rs.next()) {
			MonedaColeccionExtended _moneda = new MonedaColeccionExtended();
			_moneda.loadMonedaColExtFromResultSet(rs);
			if (null == lMonedas)
				lMonedas = new ArrayList<MonedaColeccionExtended>();
			lMonedas.add(_moneda);
		}
		rs.close();
		stm.close();
		return lMonedas;
	}

	public void loadMonedaColExtFromResultSet(ResultSet rs) throws SQLException {
		this.loadMonedaColFromResultSet(rs);

		this.nombreSocio = rs.getString(14);
		this.descrPedido = rs.getString(15);
		if (null == rs.getString(16))
			this.fechaApunte = null;
		else
			this.fechaApunte = rs.getDate(16);
		this.descrApunte = rs.getString(17);
		
		this.monedaExtended = new MonedaExtended();
		this.monedaExtended.loadMonedaExtendedFromResultSet(rs, 17);
	}

	public String getNombreSocio() {
		return nombreSocio;
	}

	public String getDescrPedido() {
		return descrPedido;
	}

	public Date getFechaApunte() {
		return fechaApunte;
	}

	public String getDescrApunte() {
		return descrApunte;
	}

	public MonedaExtended getMonedaExtended() {
		return monedaExtended;
	}
	
	public static String[] getMints(String where) {

		String sql = "SELECT DISTINCT `monedas`.`ceca` " +
		"FROM `colecciones`, `monedas` " +
		"WHERE (`colecciones`.`moneda` = `monedas`.`id`) AND " + where;
		
		sql += " ORDER BY 1";
		
		String[] mints = null;
		
		ArrayList<ArrayList<String>> rows = null;
		try {
			rows = getQueryResult(sql, 1);
			if (null != rows) {
				mints = new String[rows.size()];
				for (int i=0; i < rows.size(); i++)
					mints[i] = rows.get(i).get(0);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return mints;
		
	}
}
